/**
 * @param {number[]} nums
 * @return {number[][]}
 */
var threeSum = function (nums) {
    // 先排序
    nums.sort((a, b) => { return a - b })
    let res = [], l = nums.length

    for (let i = 0; i < l - 2; i++) {
        // 循环的值不同于前一次，避免重复
        if (i > 0 && nums[i] === nums[i - 1]) continue

        let m = l - 1

        for (let j = i + 1; j < l - 1; j++) {
            // 循环的值不同于前一次，避免重复
            if (j > i + 1 && nums[j] === nums[j - 1]) continue
            // 大于0的继续左移m(第三个值)的指针，下一个m处的值可能等于零，可能小于0
            while (j < m && (nums[i] + nums[j] + nums[m]) > 0) {
                m--
            }
            if (j === m) break
            if (nums[i] + nums[j] + nums[m] === 0) {
                res.push([nums[i], nums[j], nums[m]])
            }
        }
    }
    return res
};